<HTML>
<HEAD>
<TITLE>basic_stringbuf</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Rogue Wave Standard Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="basic-string.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="basic-stringstream.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Rogue Wave C++ Standard Library Reference Guide</B></DIV>
<H2>basic_stringbuf</H2>
<P><B>Module:</B>&nbsp;&nbsp;Standard C++ Library&nbsp;&nbsp;&nbsp;<B>Library:</B>&nbsp;&nbsp;<A HREF="2-11.html">Input/output</A></P>

<PRE><HR><B><I>basic_stringbuf</I></B> <IMG SRC="images/inherits.gif"> <B><I><A HREF="basic-streambuf.html">basic_streambuf</A></I></B><HR></PRE>

<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Interface</A></LI>
<LI><A HREF="#sec6">Member Types</A></LI>
<LI><A HREF="#sec7">Nonmember Types</A></LI>
<LI><A HREF="#sec8">Constructors</A></LI>
<LI><A HREF="#sec9">Member Functions</A></LI>
<LI><A HREF="#sec10">Example</A></LI>
<LI><A HREF="#sec11">See Also</A></LI>
<LI><A HREF="#sec12">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
<H4>Members</H4>
<UL><TABLE CELLPADDING=3>
<TR><TD VALIGN=top>
<A HREF="#idx398">basic_stringbuf()</A><BR>
<A HREF="#idx391">char_type</A><BR>
<A HREF="#idx392">ios_type</A><BR>
<A HREF="#idx393">off_type</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx400">overflow()</A><BR>
<A HREF="#idx401">pbackfail()</A><BR>
<A HREF="#idx394">pos_type</A><BR>
<A HREF="#idx402">seekoff()</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx403">seekpos()</A><BR>
<A HREF="#idx404">setbuf()</A><BR>
<A HREF="#idx405">str()</A><BR>
<A HREF="#idx395">traits_type</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx407">underflow()</A><BR>
<A HREF="#idx408">xsputn()</A><BR>
</TD></TR>
</TABLE></UL>
<H4>Non-Members</H4>
<UL><TABLE CELLPADDING=3>
<TR><TD VALIGN=top>
<A HREF="#idx396">stringbuf</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx397">wstringbuf</A><BR>
</TD>
<TD VALIGN=top></TD></TR>
</TABLE></UL>

<A NAME="sec2"><H3>Summary</H3></A>
<P>Class that associates the input or output sequence with a sequence of arbitrary characters</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;sstream&gt; 

namespace std {
  template&lt;class charT, class traits = char_traits&lt;charT&gt;,
           class Allocator = allocator&lt;charT&gt; &gt;
  class basic_stringbuf;
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The class <B><I>basic_stringbuf</I></B> is derived from <B><I><A HREF="basic-streambuf.html">basic_streambuf</A></I></B>. Its purpose is to associate the input or output sequence with a sequence of arbitrary characters. The sequence can be initialized from, or made available as, an object of class <B><I><A HREF="basic-string.html">basic_string</A></I></B>. Each object of type <B><I>basic_stringbuf</I></B> controls two character sequences:</P>
<UL>
<LI><P CLASS="LIST">a character input sequence</P></LI>
<LI><P CLASS="LIST">a character output sequence</P></LI>
</UL>
<P>See <B><I><A HREF="basic-streambuf.html">basic_streambuf</A></I></B> for more information.</P>
<P>The two sequences are related to each other, but are manipulated separately. This allows you to read and write characters at different positions in objects of type <B><I>basic_stringbuf</I></B> without any conflict (as opposed to the <B><I><A HREF="basic-filebuf.html">basic_filebuf</A></I></B> objects, in which a joint file position is maintained).</P>
<A NAME="sec5"><H3>Interface</H3></A>

<UL><PRE>namespace std {
 
  template&lt;class charT, class traits = char_traits&lt;charT&gt;,
           class allocator&lt;charT&gt; &gt;
  class basic_stringbuf 
  : public basic_streambuf&lt;charT, traits&gt; 
  {
    public:

     typedef charT                        char_type;
     typedef typename traits::int_type    int_type;
     typedef typename traits::pos_type    pos_type;
     typedef typename traits::off_type    off_type;

     explicit basic_stringbuf(ios_base::openmode =
                                (ios_base::in | ios_base::out));
     
   explicit basic_stringbuf(const basic_string&lt;char_type,
                            traits_type, Allocator&gt;&amp;,
                            ios_base::openmode = 
                            ios_base::in | ios_base::out);     
   basic_string&lt;char_type, traits_type, Allocator&gt; str() const;    
   void str(const basic_string&lt;char_type, traits_type, Allocator&gt;&amp;);

   protected:

   virtual int_type underflow();
   virtual int_type pbackfail(int_type = traits::eof());
   virtual int_type overflow(int_type = traits::eof());
   virtual basic_streambuf&lt;char_type, traits_type&gt;* 
   setbuf(char_type*,streamsize); 
   virtual pos_type seekoff(off_type, ios_base::seekdir,  
             ios_base::openmode = ios_base::in | ios_base::out);
   virtual pos_type seekpos(pos_type, 
             ios_base::openmode = ios_base::in | ios_base::out);
   virtual streamsize xsputn(const char_type*, streamsize); 
  };
}
</PRE></UL>
<A NAME="sec6"><H3>Member Types</H3></A>

<A NAME="idx391"></A><PRE><B>char_type</B></PRE>
<UL>
<P>The type <SAMP>char_type</SAMP> is a synonym for the template parameter <SAMP>charT</SAMP>.</P>
</UL>


<A NAME="idx392"></A><PRE><B>ios_type</B></PRE>
<UL>
<P>The type <SAMP>ios_type</SAMP> is an instantiation of class <B><I><A HREF="basic-ios.html">basic_ios</A></I></B> on type <SAMP>charT</SAMP>.</P>
</UL>


<A NAME="idx393"></A><PRE><B>off_type</B></PRE>
<UL>
<P>The type <SAMP>off_type</SAMP> is a synonym of type <SAMP>traits::off_type</SAMP>.</P>
</UL>


<A NAME="idx394"></A><PRE><B>pos_type</B></PRE>
<UL>
<P>The type <SAMP>pos_type</SAMP> is a synonym of type <SAMP>traits::pos_type</SAMP>.</P>
</UL>


<A NAME="idx395"></A><PRE><B>traits_type</B></PRE>
<UL>
<P>The type <SAMP>traits_type</SAMP> is a synonym for the template parameter <SAMP>traits</SAMP>.</P>
</UL>

<A NAME="sec7"><H3>Nonmember Types</H3></A>

<A NAME="idx396"></A><PRE><B>stringbuf</B> </PRE>
<UL>
<P>The type <SAMP>stringbuf</SAMP> is a specialization of class template <SAMP>basic_stringbuf</SAMP> on type <SAMP>char</SAMP>:</P>
<P><SAMP>typedef basic_stringbuf&lt;char&gt; stringbuf;</SAMP></P>
</UL>


<A NAME="idx397"></A><PRE><B>wstringbuf</B></PRE>
<UL>
<P>The type <SAMP>wstringbuf</SAMP> is a specialization of class template  <SAMP>basic_stringbuf</SAMP> on type <SAMP>wchar_t</SAMP>:</P>
<P><SAMP>typedef basic_stringbuf&lt;wchar_t&gt; wstringbuf;</SAMP></P>
</UL>

<A NAME="sec8"><H3>Constructors</H3></A>

<A NAME="idx398"></A><PRE>explicit <B>basic_stringbuf</B>(ios_base::openmode which =
                ios_base::in | ios_base::out); </PRE>
<UL>
<P>Constructs an object of class <B><I>basic_stringbuf</I></B>, initializing the base class with <SAMP>basic_streambuf()</SAMP>, and initializing the open mode with <SAMP>which</SAMP>.</P>
</UL>


<A NAME="idx399"></A><PRE>explicit <B>basic_stringbuf</B>(const string_type&amp; str,
                ios_base::openmode which =
                ios_base::in | ios_base::out); </PRE>
<UL>
<P>Constructs an object of class <B><I>basic_stringbuf</I></B>, initializing the base class with <SAMP>basic_streambuf()</SAMP>, and initializing the open mode with <SAMP>which</SAMP>. The string object <SAMP>str</SAMP> is copied to the underlying buffer. </P>
</UL>

<UL>
<LI><P CLASS="LIST">If the opening mode is <SAMP>in</SAMP>, initializes the input sequence to point to the first character of the buffer. </P></LI>
<LI><P CLASS="LIST">If the opening mode is <SAMP>out</SAMP>, initializes the output sequence to point to the first character of the buffer. </P></LI>
<LI><P CLASS="LIST">If the opening mode is <SAMP>out&nbsp;|&nbsp;app</SAMP>, initializes the output sequence to point to the last character of the buffer. </P></LI>
</UL>
<A NAME="sec9"><H3>Member Functions</H3></A>

<A NAME="idx400"></A><PRE>int_type 
<B>overflow</B>(int_type c = traits_type::eof()); </PRE>
<UL>
<P>If the output sequence has a <SAMP>put</SAMP> position available, and <SAMP>c</SAMP> is not <SAMP>traits_type::eof()</SAMP>, this function writes <SAMP>c</SAMP> into it. If there is no position available, the function increases the size of the buffer by allocating more memory and then writes <SAMP>c</SAMP> at the new current <SAMP>put</SAMP> position. If the operation fails, the function returns <SAMP>traits_type::eof()</SAMP>. Otherwise, it returns <SAMP>traits_type::not_eof(c)</SAMP>.</P>
</UL>


<A NAME="idx401"></A><PRE>int_type 
<B>pbackfail</B>(int_type c = traits_type::eof()); </PRE>
<UL>
<P>Puts back the character designated by <SAMP>c</SAMP> into the input sequence. If <SAMP>traits_type::eq_int_type(c,traits_type::eof())</SAMP> returns <SAMP>true</SAMP>, the function moves the input sequence one position backward. If the operation fails, the function returns <SAMP>traits_type::eof()</SAMP>. Otherwise, it returns <SAMP>traits_type::not_eof(c)</SAMP>.</P>
</UL>


<A NAME="idx402"></A><PRE>pos_type 
<B>seekoff</B>(off_type off, ios_base::seekdir way,
        ios_base::openmode which = 
        ios_base::in | ios_base::out); </PRE>
<UL>
<P>If the open mode is <SAMP>in | out</SAMP>, this function alters the stream position of both the input and the output sequences. If the open mode is <SAMP>in</SAMP>, it alters the stream position of only the input sequence, and if it is <SAMP>out</SAMP>, it alters the stream position of only the output sequence. The new position is calculated by combining the two parameters, <SAMP>off</SAMP> (displacement) and <SAMP>way</SAMP> (reference point). If the current position of the sequence is invalid before repositioning, the operation fails and the return value is <SAMP>pos_type(off_type(-1))</SAMP>. Otherwise, the function returns the current new position.</P>
</UL>


<A NAME="idx403"></A><PRE>pos_type 
<B>seekpos</B>(pos_type sp,ios_base::openmode which = 
        ios_base::in | ios_base::out); </PRE>
<UL>
<P>If the open mode is <SAMP>in | out</SAMP>, the function alters the stream position of both the input and the output sequences. If the open mode is <SAMP>in</SAMP>, it alters the stream position of the input sequence only, and if the open mode is <SAMP>out</SAMP>, it alters the stream position of the output sequence only. If the current position of the sequence is invalid before repositioning, the operation fails and the return value is <SAMP>pos_type(off_type(-1))</SAMP>. Otherwise, the function returns the current new position.</P>
</UL>


<A NAME="idx404"></A><PRE>basic_streambuf&lt;charT,traits&gt;* 
<B>setbuf</B>(char_type* s, streamsize n); </PRE>
<UL>
<P>A stringbuf maintains an underlying character array for storing buffered characters. This function gives you a way to resize or replace that buffer, with certain restrictions.</P>
<P>First of all, <SAMP>n</SAMP> must be greater than the number of characters currently in the buffer. If <SAMP>n</SAMP> is too small, then <SAMP>setbuf()</SAMP> has no effect and returns a null pointer to indicate failure. </P>
<P>If <SAMP>n</SAMP> is large enough, this function has one of the following effects:</P>
<UL>
<LI><P CLASS="LIST">If <SAMP>s</SAMP> is not a null pointer, <SAMP>setbuf()</SAMP> copies the buffered contents of the <B><I><A HREF="basic-stringbuf.html">stringbuf</A></I></B> into the <SAMP>n</SAMP> character array starting at <SAMP>s,</SAMP> and installs <SAMP>s</SAMP> as the underlying character array used by the <B><I>stringbuf</I></B>.  <SAMP>s</SAMP> replaces the old underlying array. In this case, the function returns <SAMP>s</SAMP> on success or a null pointer on failure. The caller is responsible for deleting the buffer.</P></LI>
<LI><P CLASS="LIST">If <SAMP>s</SAMP> is a null pointer and <SAMP>n</SAMP> is <SAMP>0</SAMP>, the function has no effect. </P></LI>
<LI><P CLASS="LIST">If <SAMP>s</SAMP> is a null pointer,  <SAMP>setbuf()</SAMP> resizes the underlying character array to <SAMP>n</SAMP> characters. The function returns a pointer to the beginning of the resized array if the operation is successful, or a null pointer if not. The object is responsible for deleting the buffer.</P></LI>
</UL>
</UL>


<A NAME="idx405"></A><PRE>
basic_string&lt;char_type, traits_type, Allocator&gt;
<B>str</B>() const; </PRE>
<UL>
<P>Returns a string object of type <SAMP>basic_string&lt;char_type, traits_type, Allocator&gt;</SAMP>, whose content is a copy of the underlying buffer contents.</P>
</UL>


<A NAME="idx406"></A><PRE>void 
<B>str</B>(const basic_string&lt;char_type,<I> </I>traits_type,<I> </I>Allocator&gt;&amp;<I> </I>str);</PRE>
<UL>
<P>Clears the underlying buffer and copies the string object <SAMP>str</SAMP> into it. If the opening mode is <SAMP>in</SAMP>, initializes the input sequence to point to the first character of the buffer. If the opening mode is <SAMP>out</SAMP>, the function initializes the output sequence to point to the first character of the buffer. If the opening mode is <SAMP>out | app</SAMP>, it initializes the output sequence to point to the last character of the buffer. </P>
</UL>


<A NAME="idx407"></A><PRE>int_type 
<B>underflow</B>();</PRE>
<UL>
<P>If the input sequence has a read position available, returns the contents of this position. Otherwise, it tries to expand the input sequence to match the output sequence, and if possible returns the content of the new current position, <SAMP>traits_type::to_int_type(*gptr())</SAMP>. The function returns <SAMP>traits_type::eof()</SAMP> to indicate failure.</P>
</UL>


<A NAME="idx408"></A><PRE>streamsize 
<B>xsputn</B>(const char_type* s, streamsize n); </PRE>
<UL>
<P>Writes up to <SAMP>n</SAMP> characters to the output sequence. The characters written are obtained from successive elements of the array whose first element is designated by <SAMP>s</SAMP>. The function returns the number of characters written.</P>
</UL>

<A NAME="sec10"><H3>Example</H3></A>

<UL><PRE>//
//  stringbuf.cpp
//
 
#include &lt;iostream&gt;   // for cout, endl
#include &lt;sstream&gt;    // for istringstream, ostringstream
#include &lt;string&gt;     // for string



int main ()
{
    // create a read/write string-stream object on tiny char
    // and attach it to an ostringstream object
    std::ostringstream out_1 (std::ios::in | std::ios::out);

    // tie the istream object to the ostringstream object
    std::istream in_1 (out_1.rdbuf ());   

    // output to out_1
    out_1 &lt;&lt; "Here is the first ouput";

    // create a string object on tiny char 
    std::string string_ex = "L'heure est grave!";

    // open a read only stringstream object and initialize it
    std::istringstream in_2 (string_ex);

    // output in_1 to the standard output
    std::cout &lt;&lt; in_1.rdbuf () &lt;&lt; std::endl;

    // reposition in_1 at the beginning
    in_1.seekg (0);

    // output in_2 to the standard output
    std::cout &lt;&lt; in_2.rdbuf () &lt;&lt; std::endl;

    // reposition in_2 at the beginning
    in_2.seekg (0);

    // get the current put position (equivalent to 
    // out_1.tellp())
    std::stringbuf::pos_type pos =
        out_1.rdbuf ()-&gt;pubseekoff (0, std::ios::cur, 
                                    std::ios::out);

    // append the content of the stringbuf pointed to by in_2
    // to the one  pointed at by out_1
    out_1 &lt;&lt; ' ' &lt;&lt; in_2.rdbuf ();

    // output in_1 to the standard output
    std::cout &lt;&lt; in_1.rdbuf () &lt;&lt; std::endl;

    // position the get sequence (equivalent to 
    // in_1.seekg (pos))
    in_1.rdbuf ()-&gt;pubseekpos (pos, std::ios::in);

    // output "L'heure est grave!"
    std::cout &lt;&lt; in_1.rdbuf () &lt;&lt; std::endl;  

    return 0;
}


Program Output:
</PRE></UL>
<UL><PRE>Here is the first ouput
L'heure est grave!
Here is the first ouput L'heure est grave!
 L'heure est grave!

</PRE></UL>
<A NAME="sec11"><H3>See Also</H3></A>
<P><B><I><A HREF="char-traits.html">char_traits</A></I></B>, <B><I><A HREF="ios-base.html">ios_base</A></I></B>, <B><I><A HREF="basic-ios.html">basic_ios</A></I></B>, <B><I><A HREF="basic-streambuf.html">basic_streambuf</A></I></B>, <B><I><A HREF="basic-string.html">basic_string</A></I></B>, <B><I><A HREF="basic-istringstream.html">basic_istringstream</A></I></B>, <B><I><A HREF="basic-ostringstream.html">basic_ostringstream</A></I></B>, <B><I><A HREF="basic-stringstream.html">basic_stringstream</A></I></B></P>
<A NAME="sec12"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems --Programming Language C++, Section 27.7.1</I></P>

<BR>
<HR>
<A HREF="basic-string.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="basic-stringstream.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A></BODY>
</HTML>
